package com.serviportales.contactenos.adminContactenos.beans;

import java.io.IOException;

import javax.faces.application.Resource;
import javax.faces.application.ResourceHandler;
import javax.faces.application.ResourceHandlerWrapper;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import com.liferay.portal.kernel.util.MimeTypesUtil;
import com.liferay.util.bridges.jsf.common.FacesMessageUtil;
import com.serviportales.contactenos.managers.MgrMensajes;
import com.serviportales.contactenos.model.Mensaje;
import com.serviportales.serviportales.beans.Contexto;

public class FCAdjuntoResourceHandler extends ResourceHandlerWrapper {

	public static final String RESOURCE_NAME = "adjuntoMensaje";
	public static final String LIBRARY_NAME = "fcAdjuntoResourceHandler";
	public static final String SCMENSAJE = "scMensaje";

	private Logger logger = Logger.getLogger(getClass());

	private ResourceHandler resourceHandler;

	public FCAdjuntoResourceHandler(ResourceHandler resourceHandler) {
		this.resourceHandler = resourceHandler;
	}

	@Override
	public Resource createResource(String resourceName, String libraryName) {
		return resourceHandler.createResource(resourceName, libraryName);
	}

	@Override
	public ResourceHandler getWrapped() {
		return resourceHandler;
	}

	@Override
	public void handleResourceRequest(FacesContext context) throws IOException {
		logger.debug("FCAdjuntoResourceHandler: handleResourceRequest");

		try {
			ExternalContext externalContext = context.getExternalContext();
			String libraryName = externalContext.getRequestParameterMap().get("ln");
			String resourceName = externalContext.getRequestParameterMap().get("javax.faces.resource");

			if (RESOURCE_NAME.equals(resourceName) && LIBRARY_NAME.equals(libraryName)) {
				String scMensaje = externalContext.getRequestParameterMap().get(SCMENSAJE);
				
				MgrMensajes mgrMensajes = ((MgrMensajes) Contexto.getApplicationContext().getBean("mgrMensajes"));
				Mensaje mensaje = mgrMensajes.buscarMensaje(Long.parseLong(scMensaje));
				
				externalContext.setResponseHeader("content-disposition", "attachment; filename=" + mensaje.getNombreAdjunto());
				externalContext.setResponseContentType(MimeTypesUtil.getContentType(mensaje.getNombreAdjunto()));
				externalContext.getResponseOutputStream().write(mensaje.getAdjunto());
				externalContext.setResponseContentLength(mensaje.getAdjunto().length);
				externalContext.setResponseStatus(HttpServletResponse.SC_OK);
			} else {
				super.handleResourceRequest(context);
			}
		} catch (Exception exception) {
			FacesMessageUtil.error(context, exception.getMessage());
			logger.error(exception.getMessage(), exception);
		}
	}

	public static String getRequestPath(String scMensaje) {

		StringBuilder buf = new StringBuilder();
		buf.append(ResourceHandler.RESOURCE_IDENTIFIER);
		buf.append("/");
		buf.append(RESOURCE_NAME);
		buf.append("?ln=");
		buf.append(LIBRARY_NAME);
		buf.append("&");
		buf.append(SCMENSAJE);
		buf.append("=");
		buf.append(scMensaje);

		return buf.toString();
	}
}
